#include <stdio.h>
#include <mysql/mysql.h>
#include <string.h>

int main(int argc, char* argv[])
{
    // 初始化连接
    MYSQL *conn;
    conn = mysql_init(NULL);
    //连接mysql服务器
    char *host ="localhost";
    char *user = "root";
    char *passwd = "123456";
    char *db = "sqlinject";
    // 建立服务器连接
    conn = mysql_real_connect(conn, host, user, passwd, db, 0, NULL, 0);
    if(conn == NULL)
    {
        printf("%s\n", mysql_error(conn));
        return 1;
    }
    //初始化MYSQL_stmt
    MYSQL_STMT *stmt = mysql_stmt_init(conn);
    if(stmt == NULL)
    {
        printf("error :%s\n", mysql_error(conn));
        mysql_close(conn);
        return 1;
    }
    const char *query = "insert into user values(?, ?, ?)";
    // 预编译初始化 执行prepare操作，将 stmt与 模板化的 SQl 语句绑定
    int ret = mysql_stmt_prepare(stmt, query, strlen(query));
    if(ret)
    {
        printf("%d, %s\n", mysql_stmt_errno(stmt),
                mysql_stmt_error(stmt));
    }
    // 获得模板化的sql语句中 占位符的个数
    int count = mysql_stmt_param_count(stmt);
    if(count != 3)
    {
        printf("%s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(conn);
        return 1;
    }
    //每个参数 对应一个 MYSQL_BIND
    MYSQL_BIND bind[3];
    // 设置参数
    int id;

    char name[20] ={0};
    unsigned long name_len = 0;
    
    char passwd1[20] = {0};
    unsigned long passwd_len = 0;

    // 绑定参数
    memset(bind, 0, sizeof(bind));
    bind[0].buffer = &id;
    bind[0].is_null = 0;    //该参数设置为0不为空，1表示参数为空
    bind[0].buffer_type = MYSQL_TYPE_LONG;
    bind[0].length = NULL;          //整数类型不要指定缓冲区长度
    
    bind[1].buffer = name;
    bind[1].is_null = 0;
    bind[1].buffer_type = MYSQL_TYPE_VAR_STRING;
    bind[1].length = &name_len;

    bind[2].buffer = passwd1;
    bind[2].is_null = 0;
    bind[2].buffer_type = MYSQL_TYPE_VAR_STRING;
    bind[2].length = &passwd_len;
    
    // 参数中占位符绑定数据
    ret = mysql_stmt_bind_param(stmt, bind);
    if(ret)
    {
        printf("%s\n", mysql_stmt_error(stmt));
        mysql_stmt_close(stmt);
        mysql_close(conn);
        return 1;
    }
    // 参数传递
    id = 3;
    strcpy(name, "jack");
    name_len = strlen("jack");
    strcpy(passwd1, "8888");
    passwd_len = strlen("8888");

    //执行模板化的sql语句
    ret = mysql_stmt_execute(stmt);
    if(ret)
    {
        printf("%d, %s\n", mysql_stmt_errno(stmt),
                mysql_stmt_error(stmt));
    }
    printf("QUERY OK, %ld row affected.\n", mysql_stmt_affected_rows(stmt));

    mysql_stmt_close(stmt);
    mysql_close(conn);
    return 0;
}